<?php

declare(strict_types=1);

namespace Modules\DataCheck\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;

/**
 * 数据核对任务表单验证请求类
 * @class DcTaskRequest
 */
class DcTaskUpdateRequest extends FormRequest
{
    /**
     * 验证错误立即停止
     * @var bool
     */
    protected $stopOnFirstFailure = true;

    /**
     * 验证规则
     * @return array
     */
    public function rules(): array
    {
        $rules = [
            'task_name'      => 'required|string|max:120',
            'target_file'    => 'required|string',
            'source_file_id' => 'nullable|integer',
            'source_file'    => [
                Rule::when(function () {
                    $sourceFileId = $this->input('source_file_id');
                    return empty($sourceFileId) || $sourceFileId == 0;
                }, 'required'),
                'nullable',
                'string'
            ],
            'source_file_original_name' => [
                Rule::when(function () {
                    $sourceFileId = $this->input('source_file_id');
                    // 当source_file_id为空或为0时，source_file_original_name必须传递
                    return empty($sourceFileId) || $sourceFileId == 0;
                }, 'required'),
                'nullable',
                'string'
            ],
            'target_file_original_name' => 'required|string|max:255'
        ];

        // 根据请求方法调整规则
        if ($this->isMethod('PUT') || $this->isMethod('PATCH')) {
            // 更新时暂无特殊规则
        }

        return $rules;
    }

    /**
     * 验证错误消息
     * @return array
     */
    public function messages(): array
    {
        return [
            'task_name.required' => '任务名称不能为空',
            'task_name.string' => '任务名称必须为字符串',
            'task_name.max' => '任务名称不能超过255个字符',
            
            'source_file_id.integer' => '总表文件ID必须为整数',
            
            'source_file.required' => '当总表文件ID为空或为0时，总表文件路径不能为空',
            'source_file.string' => '总表文件路径必须为字符串',
            
            'source_file_original_name.required' => '当总表文件ID为空或为0时，总表文件原始名称不能为空',
            'source_file_original_name.string' => '总表文件原始名称必须为字符串',
            'source_file_original_name.max' => '总表文件原始名称不能超过255个字符',
            
            'target_file.required' => '核对表文件不能为空',
            'target_file.string' => '核对表文件路径必须为字符串',
            
            'target_file_original_name.required' => '核对表文件原始名称不能为空',
            'target_file_original_name.string' => '核对表文件原始名称必须为字符串',
            'target_file_original_name.max' => '核对表文件原始名称不能超过255个字符',
        ];
    }

    /**
     * 字段别名
     * @return array
     */
    public function attributes(): array
    {
        return [
            'task_name' => '任务名称',
            'source_file_id' => '总表文件ID',
            'source_file' => '总表文件',
            'source_file_original_name' => '总表文件原始名称',
            'target_file' => '核对表文件',
            'target_file_original_name' => '核对表文件原始名称',
        ];
    }

    /**
     * 验证前数据处理
     * @return void
     */
    protected function prepareForValidation(): void
    {
        // 去除字符串前后空格
        if ($this->has('task_name')) {
            $taskName = trim($this->input('task_name'));
            
            // 如果task_name字段为空，则从请求中移除它
            if ($taskName === '') {
                $this->request->remove('task_name');
            } else {
                $this->merge([
                    'task_name' => $taskName,
                ]);
            }
        }
    }

    /**
     * 获取验证通过后的数据
     * @return array
     */
    public function validated($key = null, $default = null): array
    {
        return parent::validated($key, $default);
    }
}
